Sampling from the Bayesian Generator
We now discuss how to use the BayesianGenerator to propogate uncertainty.
As usual we start by bringing in packages
using Random, MarkovChainHammer, Statistics, LinearAlgebra
using MarkovChainHammer.BayesianMatrix
using MarkovChainHammer.TransitionMatrix: generator
using MarkovChainHammer.Trajectory: generate
Random.seed!(1234)
Random.TaskLocalRNG()
and starting off with a generator that generates a stochastic process
Q = [-1.0 4/3 2; 1/4 -2.0 1; 3/4 2/3 -3.0]
dt = 0.01
markov_chain = generate(Q, 10000; dt = dt)'
1×10000 adjoint(::Vector{Int64}) with eltype Int64:
1 1 1 1 1 1 1 1 1 1 1 1 1 … 1 1 1 1 1 1 1 1 1 1 1 1
We construct the BayesianGenerator object from a prior distribution
number_of_states = 3
prior = GeneratorParameterDistributions(number_of_states)
Q_bayes = BayesianGenerator(markov_chain, prior; dt = dt)
BayesianGenerator
prior variance
3×3 Matrix{Float64}:
1.0 0.416667 0.416667
0.416667 1.0 0.416667
0.416667 0.416667 1.0prior mean
3×3 Matrix{Float64}:
-1.0 0.5 0.5
0.5 -1.0 0.5
0.5 0.5 -1.0posterior variance
3×3 Matrix{Float64}:
0.0182632 0.0550691 0.0995698
0.00443534 0.0847981 0.0302305
0.0138278 0.0285697 0.130521posterior mean
3×3 Matrix{Float64}:
-1.13067 1.064 2.19547
0.274592 -1.62134 0.672081
0.856081 0.557335 -2.86755
We can now sample from the BayesianGenerator object which gives a random matrix drawn from the posterior distribution
rand(Q_bayes)
3×3 Matrix{Float64}:
-1.28443 0.987111 1.46499
0.308094 -1.50439 0.778556
0.976332 0.517283 -2.24355
If we call the rand function again we get a different realization
rand(Q_bayes)
3×3 Matrix{Float64}:
-1.09693 1.25391 1.9438
0.239546 -1.93427 0.746049
0.857388 0.68037 -2.68985
We can call the rand function with an additional integer argument to get a list of realizations
number_of_samples = 100
Q_bayes_list = rand(Q_bayes, number_of_samples)
100-element Vector{Matrix{Float64}}:
[-1.0863938382287588 1.090269012912725 1.8294736565302356; 0.19034429494915964 -1.4501370816881989 0.7514547478446989; 0.8960495432795991 0.3598680687754736 -2.5809284043749345]
[-1.0481184776034607 0.9615557733566846 1.5616337274921526; 0.18828311181296997 -1.4565290107987152 0.8950535312730717; 0.8598353657904908 0.49497323744203053 -2.4566872587652244]
[-1.2698598105757197 1.2208312736856268 1.937249429099191; 0.20054011420791645 -1.8903568361757102 0.8759461106502346; 1.0693196963678033 0.6695255624900834 -2.8131955397494255]
[-1.1888853760777647 1.010365312213905 2.2146059784474006; 0.39523536938456827 -1.2915796888818538 0.42681276687190384; 0.7936500066931963 0.281214376667949 -2.6414187453193043]
[-1.0197393352742763 1.256930281016118 2.169516964930346; 0.1900439358417498 -1.621802548515956 0.6702831893882244; 0.8296953994325263 0.3648722674998379 -2.8398001543185707]
[-1.3566801253059724 0.9836714876731875 1.9971110907260377; 0.4544932732165382 -1.9954717125432224 0.6411853964437394; 0.9021868520894342 1.0118002248700346 -2.638296487169777]
[-0.9296887754457219 1.2319346163589049 2.009565064606964; 0.23271405802556192 -1.673018972597842 0.8424160525918357; 0.69697471742016 0.4410843562389371 -2.8519811171988]
[-0.968913671317772 1.0896148711124527 2.144405558458069; 0.2367978009922009 -1.4241143540854218 0.6140979792533799; 0.732115870325571 0.3344994829729689 -2.758503537711449]
[-1.0340242045139374 0.8913971102385871 2.430519234716; 0.13644840607754763 -1.4109267726784902 0.6508517999410508; 0.8975757984363898 0.5195296624399028 -3.081371034657051]
[-1.4461887692959006 1.4819398253428995 2.0072604442776716; 0.3588824217190628 -2.4305308494575555 0.7069475287375584; 1.0873063475768376 0.9485910241146561 -2.7142079730152298]
⋮
[-0.9905349304660338 0.7903643365852441 3.042914552242634; 0.24956093628379364 -1.5915147218019678 0.5422118466868081; 0.7409739941822401 0.8011503852167237 -3.5851263989294417]
[-1.4380052624532704 1.236037795853921 1.8225545016889548; 0.34058681266369917 -1.8479577949377066 1.0824841704295973; 1.0974184497895714 0.6119199990837852 -2.905038672118552]
[-1.3487498703705567 0.7411020111619587 2.747152004778648; 0.2946371639280493 -1.13471466422307 0.8373995151017881; 1.0541127064425075 0.3936126530611113 -3.5845515198804367]
[-1.0429776786882903 0.9725809131522108 2.687974888295159; 0.18617471730961602 -1.6030116413987188 0.5510271710843626; 0.8568029613786743 0.6304307282465076 -3.2390020593795215]
[-1.0424250152841803 1.6588470881442705 1.6906362692966033; 0.29053663813110514 -2.1984700800332986 0.4705070271405873; 0.7518883771530751 0.539622991889028 -2.1611432964371904]
[-1.146297472605456 1.2036598098568059 2.504736422553042; 0.1572237263062368 -1.6321023546951519 0.8529428666926973; 0.989073746299219 0.42844254483834615 -3.35767928924574]
[-1.055211772995256 0.8965720052753188 2.3607594828334686; 0.3270545104511646 -1.3402075920048198 0.40747508743530936; 0.7281572625440913 0.443635586729501 -2.768234570268778]
[-1.001712564109727 1.1483245085694571 2.91762948822196; 0.23958667143228454 -1.5164472509992089 0.8978623632055582; 0.7621258926774426 0.36812274242975157 -3.8154918514275185]
[-1.1909510261909961 0.9165353994206388 2.5309066496901798; 0.24645963883016914 -1.316052336119224 0.7090360612213963; 0.9444913873608269 0.3995169366985852 -3.2399427109115755]
from whence we can compute the sample mean and compare to the analytic mean
mean(Q_bayes_list) - mean(Q_bayes)
3×3 Matrix{Float64}:
0.00725497 0.0339316 0.0183639
-0.00319942 -0.0197629 0.0236872
-0.00405555 -0.0141687 -0.0420511
and similarly for the sample variance
var(Q_bayes_list) - var(Q_bayes)
3×3 Matrix{Float64}:
0.00230174 0.00298935 0.0192147
0.000521285 0.00155187 0.00152409
0.000228445 -0.00171988 0.00283814